/**
 * API配置文件 - 集中管理所有API地址
 * 
 * 🔧 使用说明：
 * 1. 只需要修改下面的 API_BASE_URL 即可更换所有API地址
 * 2. 系统会自动处理生产/开发环境的切换
 * 3. 所有硬编码的URL都会使用这个配置
 */

// ⚠️ 只需要修改这一个URL即可更换整个系统的API地址


const API_BASE_URL = '/api'


import logger from '../utils/logger.js'

/**
 * 环境配置
 */
const config = {
  // 开发环境配置
  development: {
    baseURL: '', // 开发环境使用相对路径，通过代理转发
    proxyTarget: API_BASE_URL, // 代理目标地址
    timeout: 10000 // 减少超时时间，避免页面卡死
  },
  
  // 生产环境配置
  production: {
    baseURL: API_BASE_URL,
    timeout: 10000 // 减少超时时间，避免页面卡死
  },
  
  // 测试环境配置
  test: {
    baseURL: API_BASE_URL,
    timeout: 5000 // 测试环境使用更短的超时时间
  }
}

/**
 * 获取当前环境配置
 */
export const getApiConfig = () => {
  const env = process.env.NODE_ENV || 'development'
  return config[env] || config.development
}

/**
 * 获取基础URL（用于生产环境直接调用或日志输出）
 */
export const getBaseURL = () => {
  return API_BASE_URL
}

/**
 * 获取代理目标URL（用于vue.config.js）
 */
export const getProxyTarget = () => {
  return API_BASE_URL
}

/**
 * 构建完整URL（用于日志输出和调试）
 * @param {string} path - API路径
 * @returns {string} 完整的URL
 */
export const buildFullURL = (path) => {
  const baseURL = getBaseURL()
  const cleanPath = path.startsWith('/') ? path : `/${path}`
  return `${baseURL}${cleanPath}`
}

/**
 * 获取fallback URL（当axios实例的baseURL为空时使用）
 * @param {object} apiInstance - axios实例
 * @returns {string} fallback URL
 */
export const getFallbackURL = (apiInstance) => {
  return apiInstance?.defaults?.baseURL || getBaseURL()
}

/**
 * 处理图片URL - 将相对路径转换为完整URL
 * 注意：图片URL需要使用 /api 前缀来触发代理（仅开发环境）
 * @param {string|null|undefined} imagePath - 图片路径（可能是相对路径或完整URL）
 * @returns {string|null} 完整的图片URL或null
 */
export const buildImageURL = (imagePath) => {
  // 如果没有图片路径，返回null
  if (!imagePath) {
    return null
  }
  
  // 🔥 处理后端返回的特殊格式："文件上传成功，文件的url为：[URL]"
  if (imagePath.includes('文件上传成功') && imagePath.includes('url为：')) {
    const urlMatch = imagePath.match(/url为：(.+)$/);
    if (urlMatch && urlMatch[1]) {
      const extractedUrl = urlMatch[1].trim();
      // 移除日志，避免频繁调用时刷屏
      return extractedUrl;
    }
  }
  
  // 如果已经是完整URL（http/https开头），直接返回
  if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) {
    return imagePath
  }
  
  // 如果是base64图片，直接返回
  if (imagePath.startsWith('data:image/')) {
    return imagePath
  }
  
  // 如果是相对路径，需要添加 /api 前缀来触发代理（开发环境）
  // 开发环境：/api + imagePath -> 代理到后端
  // 生产环境：buildFullURL(imagePath) -> 完整URL
  if (process.env.NODE_ENV === 'production') {
    return buildFullURL(imagePath)
  } else {
    // 开发环境：使用 /api 前缀触发代理
    const cleanPath = imagePath.startsWith('/') ? imagePath : `/${imagePath}`
    return `/api${cleanPath}`
  }
}

/**
 * 获取需要认证的图片URL - 通过fetch获取图片并创建blob URL
 * @param {string} imagePath - 图片路径
 * @param {string} token - JWT token
 * @returns {Promise<string|null>} blob URL或null
 */
export const getAuthenticatedImageURL = async (imagePath, token) => {
  try {
    // 如果没有图片路径，返回null
    if (!imagePath) {
      return null
    }
    
    // 如果已经是blob URL，直接返回
    if (imagePath.startsWith('blob:')) {
      return imagePath
    }
    
    // 如果是base64图片，直接返回
    if (imagePath.startsWith('data:image/')) {
      return imagePath
    }
    
    // 构建完整URL
    const fullURL = buildImageURL(imagePath)
    if (!fullURL) {
      return null
    }
    
    logger.log('🔐 [API] 获取认证图片:', fullURL)
    
    // 使用fetch获取图片，携带认证token
    const response = await fetch(fullURL, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${token}`
      }
    })
    
    if (!response.ok) {
      logger.error('❌ [API] 图片请求失败:', response.status, response.statusText)
      return null
    }
    
    // 获取blob数据
    const blob = await response.blob()
    
    // 创建blob URL
    const blobURL = URL.createObjectURL(blob)
    logger.log('✅ [API] 认证图片获取成功:', blobURL)
    
    return blobURL
    
  } catch (error) {
    logger.error('❌ [API] 获取认证图片失败:', error)
    return null
  }
}

// 导出API基础URL（用于向后兼容）
export const API_BASE_URL_EXPORT = API_BASE_URL

// 导出配置对象
export default {
  API_BASE_URL,
  getApiConfig,
  getBaseURL,
  getProxyTarget,
  buildFullURL,
  getFallbackURL,
  buildImageURL,
  getAuthenticatedImageURL
} 